package com.info.pdf.base;

import static java.lang.System.out;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
import org.apache.log4j.Logger;



/**
 * @ClassName: MyFileUtils
 * @Description: TODO(自定义的常用工具类)
 * @author h819
 * @date May 14, 2009 10:15:24 AM
 * @version V1.0 作为 commons io 类的补充，平时应用的时候，主要参考 commons io，其中没有解决方法的时候，再参考本类。另外
 *          jdk 6 添加了一些新的 io 操作方法，可以再次查看
 */

// org.apache.commons.io.FilenameUtils 中有一些文件名分隔符的有用的类，如separatorsToSystem 方法等

public class MyFileUtils {

	private static Logger log = Logger.getLogger(MyFileUtils.class);
	private static ArrayList<String> fileNames = null;

	/**
	 * 静态方法调用，不需要生成实例
	 */
	public MyFileUtils() {

	}

	/**
	 * 建立文件夹.如果文件夹不存在，创建；存在则略过。
	 * 
	 * 实现代码拷贝子 commons io FileUtils.forceMkdir(File directory) ，注意体会其实现方法。
	 * 
	 * @param dirFullPath
	 *            文件夹的绝对路径
	 * @throws IOException
	 */
	public static void forceMkdir(File destDirectory) throws IOException {

		if (destDirectory.exists()) {
			if (!destDirectory.isDirectory()) {
				String message = "File " + destDirectory + " exists and is "
						+ "not a directory. Unable to create directory.";
				throw new IOException(message);
			}
		} else {
			if (!destDirectory.mkdirs()) {
				// Double-check that some other thread or process hasn't made
				// the directory in the background
				if (!destDirectory.isDirectory()) {
					String message = "Unable to create directory "
							+ destDirectory;
					throw new IOException(message);
				}
			}
		}
	}

	/**
	 * 得到给定目录的所有文件的绝对路径
	 * 
	 * @param desDirecry
	 *            指定的目录
	 * @param fileNameExtensionFilter
	 *            文件扩展名过滤器
	 * @return
	 * @throws IOException
	 */

	public static ArrayList<String> getFileNames(File desDirecry,
			MyFileNameExtensionFilter fileNameExtensionFilter)
			throws IOException {
		fileNames = new ArrayList<String>();
		getFileNamesList(desDirecry, fileNameExtensionFilter);
		return fileNames;
	}

	/**
	 * 找到给定目录的所有文件的绝对路径，并把结果放入全局变量。设置全局变量保存结果，而不是直接返回，是因为用了递归方法。
	 * 
	 * @param desDirecry
	 *            指定的目录
	 * @param fileNameExtensionFilter
	 *            文件扩展名过滤器
	 * @throws IOException
	 */
	private static void getFileNamesList(File desDirecry,
			MyFileNameExtensionFilter fileNameExtensionFilter)
			throws IOException {

		if (!desDirecry.isDirectory())
			return;

		File[] files;

		files = desDirecry.listFiles(fileNameExtensionFilter);

		// log.info("====");
		// for(File f : files)
		// log.info(f);

		for (File f : files) {
			if (f.isFile())
				fileNames.add(f.getAbsolutePath());
			if (f.isDirectory())
				getFileNamesList(f, fileNameExtensionFilter);
		}
	}

	/**
	 * windows 系统中，\ , / , : , * , ? , " , < , > , | 九个字符不能出现在文件夹中，用指定的字符代替。
	 * 
	 * @param filename
	 *            文件名称
	 * @param replacement
	 *            替代的字符串
	 * @return
	 */
	public static String getWindowsLegalFileName(String filename,
			String replacement) {

		filename = StringUtils.replace(filename, "\\", replacement);
		filename = StringUtils.replace(filename, "/", replacement);
		filename = StringUtils.replace(filename, ":", replacement);
		filename = StringUtils.replace(filename, "*", replacement);
		filename = StringUtils.replace(filename, "?", replacement);
		filename = StringUtils.replace(filename, "\"", replacement);
		filename = StringUtils.replace(filename, "<", replacement);
		filename = StringUtils.replace(filename, ">", replacement);
		filename = StringUtils.replace(filename, "|", replacement);

		return filename;

	}

	/**
	 * 得到 jar 资源文件路径。
	 * 
	 * 如果资源文件已经在临时目录中，直接返回其路径
	 * 
	 * 如果不在临时目录中，则拷贝资源文件到系统临时目录，并返回其路径
	 * 
	 * @param Resourcename
	 *            如果资源文件在 source.jar 文件的根目录下，
	 * 
	 *            Resourcename 写法应如下：/template.xls
	 * 
	 * @return 资源文件路径
	 * @throws MyMessageException
	 */
	public String getResourceFilePath(String Resourcename)
			throws MyMessageException {

		String tempfilepath = SystemUtils.getJavaIoTmpDir() + File.separator
				+ StringUtils.substringAfterLast(Resourcename, "/");

		File f = new File(tempfilepath);

		log.info("tempfilepath :" + tempfilepath);

		log.info("Resourcename :" + Resourcename);

		// 如果临时文件存在，直接返回其路径
		if (f.exists() && FileUtils.sizeOf(f) != 0)
			return f.getAbsolutePath();

		InputStream is = this.getClass().getResourceAsStream(Resourcename);

		if (is == null) {
			throw new MyMessageException(Resourcename + " not exist.");
		}

		try {
			// 拷贝资源文件到临时文件夹
			FileUtils.copyInputStreamToFile(is, f);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return tempfilepath;
	}

	/**
	 * 拷贝制定 jar 资源中的文件到系统临时目录
	 * 
	 * 
	 * @param Resourcename
	 *            资源数组名称，例如 pdfdecrypt.jar 根目录下的三个文件，拷贝到临时目录下的 pdfdecrypt 的文件夹中
	 * 
	 *            参数写法
	 * 
	 *            String[] Resourcename = new String[] { "/license.dat",
	 *            "/pdfdecrypt.exe", "/SkinMagic.dll" };
	 * 
	 * @throws MyMessageException
	 */
	public void copyResourceFileToTmpDir(String[] Resourcename)
			throws MyMessageException {

		// 拷贝资源文件到临时目录
		// String[] Resourcename = new String[] { "/pdfdecrypt/license.dat",
		// "/pdfdecrypt/pdfdecrypt.exe", "/pdfdecrypt/SkinMagic.dll" };

		InputStream is = null;

		for (String s : Resourcename) {
			is = this.getClass().getResourceAsStream(s);

			if (is == null) {
				throw new MyMessageException(Resourcename + " not exist.");
			}

			String tempfilepath = SystemUtils.getJavaIoTmpDir()
					+ File.separator + s;
			File f = new File(tempfilepath);
			// 如果临时文件存在，直接返回其路径
			if (!f.exists() || FileUtils.sizeOf(f) == 0) {

				try {
					// 拷贝资源文件到临时文件夹
					FileUtils.copyInputStreamToFile(is, f);

				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}

		}
	}

	private void test() {

	}

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		// Windows下路径分隔符是"\"
		// Unix与Linux下路径分隔符是"/"
		// *****如果路径分隔符用File.separator表示，则可移植性更强。

		MyFileUtils mf = new MyFileUtils();

	}

}
